🎖️GitЯра🎖️
src/helpers/BaseChatMesh.h 93b2db63de9009af047a2d0e1bcd97b4b0ba7106 (93b2db63) Text, 9.18 KB
Tff7b72#Tff7b72pragma once
Tff7b72#Tff7b72include T8b949e<Arduino.h> T8b949e// needed for PlatformIO
Tff7b72#Tff7b72include T8b949e<Mesh.h>
Tff7b72#Tff7b72include T8b949e<helpers/AdvertDataHelpers.h>
Tff7b72#Tff7b72include T8b949e<helpers/TxtDataHelpers.h>
Tff7b72#Tff7b72define MAX_TEXT_LEN (10*CIPHER_BLOCK_SIZE) T8b949e// must be LESS than (MAX_PACKET_PAYLOAD - 4 - CIPHER_MAC_SIZE - 1)
Tff7b72#Tff7b72include T8b949e"ContactInfo.h"
Tff7b72#Tff7b72define MAX_SEARCH_RESULTS 8
Tff7b72#Tff7b72define MSG_SEND_FAILED 0
Tff7b72#Tff7b72define MSG_SEND_SENT_FLOOD 1
Tff7b72#Tff7b72define MSG_SEND_SENT_DIRECT 2
Tff7b72#Tff7b72define REQ_TYPE_GET_STATUS 0x01 T8b949e// same as _GET_STATS
Tff7b72#Tff7b72define REQ_TYPE_KEEP_ALIVE 0x02
Tff7b72#Tff7b72define RESP_SERVER_LOGIN_OK 0 T8b949e// response to ANON_REQ
Te6edf3class Te6edf3ContactVisitor Tb4b4b4{
Te6edf3publicTff7b72:
Te6edf3virtual Tffa657void Te6edf3onContactVisitTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Te6edf3class Te6edf3BaseChatMeshTb4b4b4;
Te6edf3class Te6edf3ContactsIterator Tb4b4b4{
Tffa657int Te6edf3next_idxTb4b4b4;
Te6edf3publicTff7b72:
Te6edf3ContactsIteratorTb4b4b4(Tffa657int Te6edf3startTb4b4b4) Tb4b4b4{ Te6edf3next_idx Tff7b72= Te6edf3startTb4b4b4; Tb4b4b4}
Tffa657bool Te6edf3hasNextTb4b4b4(Tff7b72const Te6edf3BaseChatMeshTff7b72* Te6edf3meshTb4b4b4, Te6edf3ContactInfoTff7b72& Te6edf3destTb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Tff7b72#Tff7b72ifndef MAX_CONTACTS
Tff7b72#Tff7b72define MAX_CONTACTS 32
Tff7b72#Tff7b72endif
Tff7b72#Tff7b72define MAX_ANON_CONTACTS 8
Tff7b72#Tff7b72ifndef MAX_CONNECTIONS
Tff7b72#Tff7b72define MAX_CONNECTIONS 16
Tff7b72#Tff7b72endif
Tff7b72struct T56d364ConnectionInfo Tb4b4b4{
Te6edf3meshTff7b72:Tff7b72:Te6edf3Identity Te6edf3server_idTb4b4b4;
Tffa657unsigned Tffa657long Te6edf3next_pingTb4b4b4;
Tffa657uint32_t Te6edf3last_activityTb4b4b4;
Tffa657uint32_t Te6edf3keep_alive_millisTb4b4b4;
Tffa657uint32_t Te6edf3expected_ackTb4b4b4;
Tb4b4b4}Tb4b4b4;
Tff7b72#Tff7b72include T8b949e"ChannelDetails.h"
T8b949e/**
* \brief abstract Mesh class for common 'chat' client
*/
Te6edf3class Te6edf3BaseChatMesh Tff7b72: Te6edf3public Te6edf3meshTff7b72:Tff7b72:Te6edf3Mesh Tb4b4b4{
Te6edf3friend Te6edf3class Te6edf3ContactsIteratorTb4b4b4;
Te6edf3ContactInfo Te6edf3contactsTb4b4b4[Te6edf3MAX_CONTACTSTff7b72+Te6edf3MAX_ANON_CONTACTSTb4b4b4]Tb4b4b4;
Tffa657int Te6edf3num_contactsTb4b4b4;
Tffa657int Te6edf3sort_arrayTb4b4b4[Te6edf3MAX_CONTACTSTff7b72+Te6edf3MAX_ANON_CONTACTSTb4b4b4]Tb4b4b4;
Tffa657int Te6edf3matching_peer_indexesTb4b4b4[Te6edf3MAX_SEARCH_RESULTSTb4b4b4]Tb4b4b4;
Tffa657unsigned Tffa657long Te6edf3txt_send_timeoutTb4b4b4;
Tff7b72#Tff7b72ifdef MAX_GROUP_CHANNELS
Te6edf3ChannelDetails Te6edf3channelsTb4b4b4[Te6edf3MAX_GROUP_CHANNELSTb4b4b4]Tb4b4b4;
Tffa657int Te6edf3num_channelsTb4b4b4; T8b949e// only for addChannel()
Tff7b72#Tff7b72endif
Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3_pendingLoopbackTb4b4b4;
Tffa657uint8_t Te6edf3temp_bufTb4b4b4[Te6edf3MAX_TRANS_UNITTb4b4b4]Tb4b4b4;
Te6edf3ConnectionInfo Te6edf3connectionsTb4b4b4[Te6edf3MAX_CONNECTIONSTb4b4b4]Tb4b4b4;
Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Td2a8ffcomposeMsgPacketTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3recipientTb4b4b4, Tffa657uint32_t Te6edf3timestampTb4b4b4, Tffa657uint8_t Te6edf3attemptTb4b4b4, Tff7b72const Tffa657char Tff7b72*Te6edf3textTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3expected_ackTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffsendAckToTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3destTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3ack_hashTb4b4b4, Tffa657uint8_t Te6edf3ack_lenTff7b72=T79c0ff4Tb4b4b4)Tb4b4b4;
Te6edf3protectedTff7b72:
Te6edf3BaseChatMeshTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3RadioTff7b72& Te6edf3radioTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3MillisecondClockTff7b72& Te6edf3msTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3RNGTff7b72& Te6edf3rngTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3RTCClockTff7b72& Te6edf3rtcTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketManagerTff7b72& Te6edf3mgrTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3MeshTablesTff7b72& Te6edf3tablesTb4b4b4)
Tff7b72: Te6edf3meshTff7b72:Tff7b72:Te6edf3MeshTb4b4b4(Te6edf3radioTb4b4b4, Te6edf3msTb4b4b4, Te6edf3rngTb4b4b4, Te6edf3rtcTb4b4b4, Te6edf3mgrTb4b4b4, Te6edf3tablesTb4b4b4)
Tb4b4b4{
Te6edf3resetContactsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tff7b72#Tff7b72ifdef MAX_GROUP_CHANNELS
Te6edf3memsetTb4b4b4(Te6edf3channelsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3channelsTb4b4b4)Tb4b4b4)Tb4b4b4;
Te6edf3num_channels Tff7b72= T79c0ff0Tb4b4b4;
Tff7b72#Tff7b72endif
Te6edf3txt_send_timeout Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3_pendingLoopback Tff7b72= Tffa657NULLTb4b4b4;
Te6edf3memsetTb4b4b4(Te6edf3connectionsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3connectionsTb4b4b4)Tb4b4b4)Tb4b4b4;
Tb4b4b4}
Tffa657void Te6edf3bootstrapRTCfromContactsTb4b4b4(Tb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffresetContactsTb4b4b4(Tb4b4b4) Tb4b4b4{
Te6edf3memsetTb4b4b4(Te6edf3contactsTb4b4b4, T79c0ff0Tb4b4b4, Tff7b72sizeofTb4b4b4(Te6edf3contactsTb4b4b4[T79c0ff0Tb4b4b4]Tb4b4b4)Tff7b72*Te6edf3MAX_ANON_CONTACTSTb4b4b4)Tb4b4b4; T8b949e// set all to have type = ADV_TYPE_NONE(0)
Te6edf3num_contacts Tff7b72= Te6edf3MAX_ANON_CONTACTSTb4b4b4; T8b949e// seed the first contacts for anon requests
Tb4b4b4}
Tffa657void Td2a8ffpopulateContactFromAdvertTb4b4b4(Te6edf3ContactInfoTff7b72& Te6edf3ciTb4b4b4, Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3IdentityTff7b72& Te6edf3idTb4b4b4, Tff7b72const Te6edf3AdvertDataParserTff7b72& Te6edf3parserTb4b4b4, Tffa657uint32_t Te6edf3timestampTb4b4b4)Tb4b4b4;
Te6edf3ContactInfoTff7b72* Td2a8ffallocateContactSlotTb4b4b4(Tffa657bool Te6edf3transient_onlyTff7b72=Tffa657falseTb4b4b4)Tb4b4b4; T8b949e// helper to find slot for new contact
T8b949e// 'UI' concepts, for sub-classes to implement
Te6edf3virtual Tffa657bool Te6edf3isAutoAddEnabledTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Tffa657trueTb4b4b4; Tb4b4b4}
Te6edf3virtual Tffa657bool Te6edf3shouldAutoAddContactTypeTb4b4b4(Tffa657uint8_t Te6edf3typeTb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Tffa657trueTb4b4b4; Tb4b4b4}
Te6edf3virtual Tffa657void Te6edf3onContactsFullTb4b4b4(Tb4b4b4) Tb4b4b4{Tb4b4b4}Tb4b4b4;
Te6edf3virtual Tffa657bool Te6edf3shouldOverwriteWhenFullTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Tffa657falseTb4b4b4; Tb4b4b4}
Te6edf3virtual Tffa657uint8_t Te6edf3getAutoAddMaxHopsTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return T79c0ff0Tb4b4b4; Tb4b4b4} T8b949e// 0 = no limit, 1 = direct (0 hops), N = up to N-1 hops
Te6edf3virtual Tffa657void Te6edf3onContactOverwriteTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pub_keyTb4b4b4) Tb4b4b4{Tb4b4b4}Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3onDiscoveredContactTb4b4b4(Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4, Tffa657bool Te6edf3is_newTb4b4b4, Tffa657uint8_t Te6edf3path_lenTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pathTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Te6edf3ContactInfoTff7b72* Te6edf3processAckTb4b4b4(Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3dataTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3onContactPathUpdatedTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657bool Te6edf3onContactPathRecvTb4b4b4(Te6edf3ContactInfoTff7b72& Te6edf3fromTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3in_pathTb4b4b4, Tffa657uint8_t Te6edf3in_path_lenTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3out_pathTb4b4b4, Tffa657uint8_t Te6edf3out_path_lenTb4b4b4, Tffa657uint8_t Te6edf3extra_typeTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3extraTb4b4b4, Tffa657uint8_t Te6edf3extra_lenTb4b4b4)Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3onMessageRecvTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4, Tffa657uint32_t Te6edf3sender_timestampTb4b4b4, Tff7b72const Tffa657char Tff7b72*Te6edf3textTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3onCommandDataRecvTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4, Tffa657uint32_t Te6edf3sender_timestampTb4b4b4, Tff7b72const Tffa657char Tff7b72*Te6edf3textTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3onSignedMessageRecvTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4, Tffa657uint32_t Te6edf3sender_timestampTb4b4b4, Tff7b72const Tffa657uint8_t Tff7b72*Te6edf3sender_prefixTb4b4b4, Tff7b72const Tffa657char Tff7b72*Te6edf3textTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657uint32_t Te6edf3calcFloodTimeoutMillisForTb4b4b4(Tffa657uint32_t Te6edf3pkt_airtime_millisTb4b4b4) Tff7b72const Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657uint32_t Te6edf3calcDirectTimeoutMillisForTb4b4b4(Tffa657uint32_t Te6edf3pkt_airtime_millisTb4b4b4, Tffa657uint8_t Te6edf3path_lenTb4b4b4) Tff7b72const Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3onSendTimeoutTb4b4b4(Tb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3onChannelMessageRecvTb4b4b4(Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3GroupChannelTff7b72& Te6edf3channelTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4, Tffa657uint32_t Te6edf3timestampTb4b4b4, Tff7b72const Tffa657char Tff7b72*Te6edf3textTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3onChannelDataRecvTb4b4b4(Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3GroupChannelTff7b72& Te6edf3channelTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4, Tffa657uint16_t Te6edf3data_typeTb4b4b4,
Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657size_t Te6edf3data_lenTb4b4b4) Tb4b4b4{Tb4b4b4}
Te6edf3virtual Tffa657uint8_t Te6edf3onContactRequestTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4, Tffa657uint32_t Te6edf3sender_timestampTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657uint8_t Te6edf3lenTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3replyTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3onContactResponseTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657uint8_t Te6edf3lenTb4b4b4) Tff7b72= T79c0ff0Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3handleReturnPathRetryTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pathTb4b4b4, Tffa657uint8_t Te6edf3path_lenTb4b4b4)Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3sendFloodScopedTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3recipientTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4;
Te6edf3virtual Tffa657void Te6edf3sendFloodScopedTb4b4b4(Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3GroupChannelTff7b72& Te6edf3channelTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3pktTb4b4b4, Tffa657uint32_t Te6edf3delay_millisTff7b72=T79c0ff0Tb4b4b4)Tb4b4b4;
T8b949e// storage concepts, for sub-classes to override/implement
Te6edf3virtual Tffa657int Te6edf3getBlobByKeyTb4b4b4(Tff7b72const Tffa657uint8_t Te6edf3keyTb4b4b4[Tb4b4b4]Tb4b4b4, Tffa657int Te6edf3key_lenTb4b4b4, Tffa657uint8_t Te6edf3dest_bufTb4b4b4[Tb4b4b4]Tb4b4b4) Tb4b4b4{ Tff7b72return T79c0ff0Tb4b4b4; Tb4b4b4} T8b949e// not implemented
Te6edf3virtual Tffa657bool Te6edf3putBlobByKeyTb4b4b4(Tff7b72const Tffa657uint8_t Te6edf3keyTb4b4b4[Tb4b4b4]Tb4b4b4, Tffa657int Te6edf3key_lenTb4b4b4, Tff7b72const Tffa657uint8_t Te6edf3src_bufTb4b4b4[Tb4b4b4]Tb4b4b4, Tffa657int Te6edf3lenTb4b4b4) Tb4b4b4{ Tff7b72return Tffa657falseTb4b4b4; Tb4b4b4}
T8b949e// Mesh overrides
Tffa657void Te6edf3onAdvertRecvTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3IdentityTff7b72& Te6edf3idTb4b4b4, Tffa657uint32_t Te6edf3timestampTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3app_dataTb4b4b4, Tffa657size_t Te6edf3app_data_lenTb4b4b4) Te6edf3overrideTb4b4b4;
Tffa657int Td2a8ffsearchPeersByHashTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3hashTb4b4b4) Te6edf3overrideTb4b4b4;
Tffa657void Td2a8ffgetPeerSharedSecretTb4b4b4(Tffa657uint8_tTff7b72* Te6edf3dest_secretTb4b4b4, Tffa657int Te6edf3peer_idxTb4b4b4) Te6edf3overrideTb4b4b4;
Tffa657void Td2a8ffonPeerDataRecvTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint8_t Te6edf3typeTb4b4b4, Tffa657int Te6edf3sender_idxTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3secretTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657size_t Te6edf3lenTb4b4b4) Te6edf3overrideTb4b4b4;
Tffa657bool Td2a8ffonPeerPathRecvTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657int Te6edf3sender_idxTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3secretTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3pathTb4b4b4, Tffa657uint8_t Te6edf3path_lenTb4b4b4, Tffa657uint8_t Te6edf3extra_typeTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3extraTb4b4b4, Tffa657uint8_t Te6edf3extra_lenTb4b4b4) Te6edf3overrideTb4b4b4;
Tffa657void Td2a8ffonAckRecvTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint32_t Te6edf3ack_crcTb4b4b4) Te6edf3overrideTb4b4b4;
Tff7b72#Tff7b72ifdef MAX_GROUP_CHANNELS
Tffa657int Td2a8ffsearchChannelsByHashTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3hashTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3GroupChannel Te6edf3channelsTb4b4b4[Tb4b4b4]Tb4b4b4, Tffa657int Te6edf3max_matchesTb4b4b4) Te6edf3overrideTb4b4b4;
Tff7b72#Tff7b72endif
Tffa657void Td2a8ffonGroupDataRecvTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3packetTb4b4b4, Tffa657uint8_t Te6edf3typeTb4b4b4, Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3GroupChannelTff7b72& Te6edf3channelTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657size_t Te6edf3lenTb4b4b4) Te6edf3overrideTb4b4b4;
T8b949e// Connections
Tffa657bool Td2a8ffstartConnectionTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4, Tffa657uint16_t Te6edf3keep_alive_secsTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffstopConnectionTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pub_keyTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffhasConnectionToTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pub_keyTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffmarkConnectionActiveTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4)Tb4b4b4;
Te6edf3ContactInfoTff7b72* Td2a8ffcheckConnectionsAckTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffcheckConnectionsTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3publicTff7b72:
Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Te6edf3createSelfAdvertTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3nameTb4b4b4)Tb4b4b4;
Te6edf3meshTff7b72:Tff7b72:Te6edf3PacketTff7b72* Td2a8ffcreateSelfAdvertTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3nameTb4b4b4, Tffa657double Te6edf3latTb4b4b4, Tffa657double Te6edf3lonTb4b4b4)Tb4b4b4;
Tffa657int Td2a8ffsendMessageTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3recipientTb4b4b4, Tffa657uint32_t Te6edf3timestampTb4b4b4, Tffa657uint8_t Te6edf3attemptTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3textTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3expected_ackTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3est_timeoutTb4b4b4)Tb4b4b4;
Tffa657int Td2a8ffsendCommandDataTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3recipientTb4b4b4, Tffa657uint32_t Te6edf3timestampTb4b4b4, Tffa657uint8_t Te6edf3attemptTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3textTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3est_timeoutTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffsendGroupMessageTb4b4b4(Tffa657uint32_t Te6edf3timestampTb4b4b4, Te6edf3meshTff7b72:Tff7b72:Te6edf3GroupChannelTff7b72& Te6edf3channelTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3sender_nameTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3textTb4b4b4, Tffa657int Te6edf3text_lenTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffsendGroupDataTb4b4b4(Te6edf3meshTff7b72:Tff7b72:Te6edf3GroupChannelTff7b72& Te6edf3channelTb4b4b4, Tffa657uint8_tTff7b72* Te6edf3pathTb4b4b4, Tffa657uint8_t Te6edf3path_lenTb4b4b4, Tffa657uint16_t Te6edf3data_typeTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657int Te6edf3data_lenTb4b4b4)Tb4b4b4;
Tffa657int Td2a8ffsendLoginTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3recipientTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3passwordTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3est_timeoutTb4b4b4)Tb4b4b4;
Tffa657int Td2a8ffsendAnonReqTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3recipientTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3dataTb4b4b4, Tffa657uint8_t Te6edf3lenTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3tagTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3est_timeoutTb4b4b4)Tb4b4b4;
Tffa657int Td2a8ffsendRequestTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3recipientTb4b4b4, Tffa657uint8_t Te6edf3req_typeTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3tagTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3est_timeoutTb4b4b4)Tb4b4b4;
Tffa657int Td2a8ffsendRequestTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3recipientTb4b4b4, Tff7b72const Tffa657uint8_tTff7b72* Te6edf3req_dataTb4b4b4, Tffa657uint8_t Te6edf3data_lenTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3tagTb4b4b4, Tffa657uint32_tTff7b72& Te6edf3est_timeoutTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffshareContactZeroHopTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4)Tb4b4b4;
Tffa657uint8_t Td2a8ffexportContactTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4, Tffa657uint8_t Te6edf3dest_bufTb4b4b4[Tb4b4b4]Tb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffimportContactTb4b4b4(Tff7b72const Tffa657uint8_t Te6edf3src_bufTb4b4b4[Tb4b4b4]Tb4b4b4, Tffa657uint8_t Te6edf3lenTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffresetPathToTb4b4b4(Te6edf3ContactInfoTff7b72& Te6edf3recipientTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffscanRecentContactsTb4b4b4(Tffa657int Te6edf3last_nTb4b4b4, Te6edf3ContactVisitorTff7b72* Te6edf3visitorTb4b4b4)Tb4b4b4;
Te6edf3ContactInfoTff7b72* Td2a8ffsearchContactsByPrefixTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3name_prefixTb4b4b4)Tb4b4b4;
Te6edf3ContactInfoTff7b72* Td2a8fflookupContactByPubKeyTb4b4b4(Tff7b72const Tffa657uint8_tTff7b72* Te6edf3pub_keyTb4b4b4, Tffa657int Te6edf3prefix_lenTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffremoveContactTb4b4b4(Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffaddContactTb4b4b4(Tff7b72const Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4)Tb4b4b4;
Tffa657int Td2a8ffgetTotalContactSlotsTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3num_contactsTb4b4b4; Tb4b4b4}
Tffa657int Td2a8ffgetNumContactsTb4b4b4(Tb4b4b4) Tff7b72const Tb4b4b4{ Tff7b72return Te6edf3num_contacts Tff7b72- Te6edf3MAX_ANON_CONTACTSTb4b4b4; Tb4b4b4} T8b949e// don't include the reserved slots at start
Tffa657bool Td2a8ffgetContactByIdxTb4b4b4(Tffa657uint32_t Te6edf3idxTb4b4b4, Te6edf3ContactInfoTff7b72& Te6edf3contactTb4b4b4)Tb4b4b4;
Te6edf3ContactsIterator Td2a8ffstartContactsIteratorTb4b4b4(Tb4b4b4)Tb4b4b4;
Te6edf3ChannelDetailsTff7b72* Td2a8ffaddChannelTb4b4b4(Tff7b72const Tffa657charTff7b72* Te6edf3nameTb4b4b4, Tff7b72const Tffa657charTff7b72* Te6edf3psk_base64Tb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffgetChannelTb4b4b4(Tffa657int Te6edf3idxTb4b4b4, Te6edf3ChannelDetailsTff7b72& Te6edf3destTb4b4b4)Tb4b4b4;
Tffa657bool Td2a8ffsetChannelTb4b4b4(Tffa657int Te6edf3idxTb4b4b4, Tff7b72const Te6edf3ChannelDetailsTff7b72& Te6edf3srcTb4b4b4)Tb4b4b4;
Tffa657int Td2a8fffindChannelIdxTb4b4b4(Tff7b72const Te6edf3meshTff7b72:Tff7b72:Te6edf3GroupChannelTff7b72& Te6edf3chTb4b4b4)Tb4b4b4;
Tffa657void Td2a8ffloopTb4b4b4(Tb4b4b4)Tb4b4b4;
Tb4b4b4}Tb4b4b4;
Served by rngit 1.5.2 - Generated in 0.07s